/*
 * @(#)Certificate.java	1.17 01/12/12
 *
 * 版权所有2002 Sun MicroSystems，Inc.保留所有权利。Sun专有/机密。使用受许可条款的约束。
 */
 
package java.security;

import java.io.*;
import java.util.Date;

/**
 * <p>这是用于管理身份证书的抽象方法的接口。身份证书是主体对公钥是另一个主体的公钥的保证。(主体代表实体，如个人用户或组。)
 * 具体地说，该接口旨在成为具有不同格式但具有重要共同用途的构造的公共抽象。
 * 例如，不同类型的证书，例如X.509证书和PGP证书，共享一般证书功能(需要对证书进行编码和解码)和某些类型的信息，
 * 例如公钥、其密钥所在的主体以及保证公钥是指定主体的公钥的担保者。因此，X.509证书和一个。
 * PGP证书的实现既可以利用证书接口，也可以使用证书接口，即使它们的格式以及存储的附加类型和信息量不同。
 *
 * <p><b>重要信息</b>：此界面对于对共享某些常见用途的对象进行编目和分组非常有用。
 * 它没有自己的任何语义。具体地说，证书对象不会对绑定的<i>有效性</i>做出任何声明。
 * 实现此接口的应用程序有责任验证证书并确保其有效性。
 *
 * @version 	1.14 01/29/97
 * @author Benjamin Renaud 
 */
public interface Certificate {

    /** 
     * 返回证书的担保人，即保证与此证书关联的公钥是与此证书关联的主体的公钥的主体。
     * 对于X.509证书，担保人通常是证书颁发机构(如美国邮政或Verisign，Inc.)。
     *
     * @return the guarantor which guaranteed the principal-key
     * binding.
     */
    public abstract Principal getGuarantor();
    
    /**
     * 返回由担保人保证的主体-密钥对的主体。
     *
     * @return the principal to which this certificate is bound.  
     */
    public abstract Principal getPrincipal();

    /**
     * 返回由担保人保证的主体密钥对中的密钥。
     * 
     * @return 此证书证明的公钥属于。给某一特定的本金。
     */
    public abstract PublicKey getPublicKey();

    /**
     * 以<code>decode</code>方法可以解码的格式将证书编码为输出流。
     *
     * @param stream the output stream to which to encode the
     * certificate.
     *
     * @exception KeyException 如果证书未正确初始化，或数据丢失等。
     *
     * @exception IOException 如果在尝试将编码的证书输出到输出流时发生流异常。
     *
     * @see #decode 
     * @see #getFormat
     */
    public abstract void encode(OutputStream stream) 
        throws KeyException, IOException;

    /**
     * 从输入流中解码证书。格式应为<code>getFormat</code>返回、<code>encode</code>生成的格式。
     *
     * @param stream 从中提取要解码的数据的输入流。
     * 
     * @exception KeyException 如果证书未正确初始化，或数据丢失等。
     *
     * @exception IOException 如果在尝试从输入流输入编码的证书时发生异常。
     *
     * @see #encode 
     * @see #getFormat
     */
    public abstract void decode(InputStream stream) 
        throws KeyException, IOException;


    /**
     * 返回编码格式的名称。这被用作查找适当解析器的提示。它可以是“X.509”、“PGP”等。
     * 这是<code>encode</code>和<code>decode</code>方法生成和理解的格式。
     * 
     * @return the name of the coding format.
     */
    public abstract String getFormat();

    /**
     * 返回表示证书内容的字符串。
     *
     * @param detailed 是否提供有关证书的详细信息。
     */
    public String toString(boolean detailed);
}

